package co.gov.medellin.ssti.sub.model.service.impl;

import java.sql.SQLIntegrityConstraintViolationException;
import java.util.Collection;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import co.gov.medellin.ssti.sub.model.dao.EmpresaDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.service.EmpresaService;
import co.gov.medellin.ssti.sub.model.vo.BeneficioOtorgadoEmpresaVO;
import co.gov.medellin.ssti.sub.model.vo.BeneficioOtorgadoVO;
import co.gov.medellin.ssti.sub.model.vo.BeneficioVO;
import co.gov.medellin.ssti.sub.model.vo.CondicionConsultaVO;
import co.gov.medellin.ssti.sub.model.vo.EmpresaVO;
import co.gov.medellin.ssti.sub.model.vo.ProgramaVO;
import co.gov.medellin.ssti.sub.model.vo.RepAtributoVO;
import co.gov.medellin.ssti.sub.model.vo.RepEmpresaVO;
import co.gov.medellin.ssti.sub.model.vo.ReportComunaVO;
import co.gov.medellin.ssti.sub.model.vo.ReporteTotalComunaVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;

@Service
@Transactional
public class EmpresaServiceImpl implements EmpresaService {
	@Autowired
	EmpresaDAO empresaDAOImpl;

	public Collection<EmpresaVO> findEmpresaByCriteria(EmpresaVO criteria) {
		try {
			return empresaDAOImpl.findEmpresaByCriteria(criteria);
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

	public EmpresaVO findEmpresaByCodigo(long codigo) {
		try {
			return empresaDAOImpl.findEmpresaByCodigo(codigo);
		} catch (IncorrectResultSizeDataAccessException e) {
			return null;
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

	public int actualizarEmpresa(EmpresaVO empresa) throws DAOException {
		if (empresa == null) {
			throw new DAOException("Empresa no puede ser null");
		}
		// requeridos
		if (empresa.getCodigo() == null) {
			throw new DAOException("Falta el codigo de la empresa");
		}
		if (empresa.getNitIdupa() == null
				|| empresa.getNitIdupa().trim().equals("")) {
			throw new DAOException("Nit no valido");
		}
		if (empresa.getRazonSocial() == null
				|| empresa.getRazonSocial().trim().equals("")) {
			throw new DAOException("Razon social no permitida");
		}

		try {
			int rowNum = empresaDAOImpl.actualizarEmpresa(empresa);
			if (rowNum > 1) {
				throw new DAOException(
						"Error, se actualizo mas de un registro. Se deshace la transaccion.");
			} else {
				return rowNum;
			}
		} catch (DataAccessException e) {
			if (e.getRootCause() instanceof SQLIntegrityConstraintViolationException) {
				throw new DAOException(e.getRootCause());
			}
			return 0;
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

	public int ingresarEmpresa(EmpresaVO empresa) {
		try {
			return empresaDAOImpl.ingresarEmpresa(empresa);
		} catch (DataAccessException e) {
			System.out.println(e.getMessage());
			return 0;
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

	public Collection<BeneficioOtorgadoVO> findBeneficios(EmpresaVO criteria) {
		try {
			return empresaDAOImpl.findBeneficios(criteria);
		} catch (IncorrectResultSizeDataAccessException e) {
			return null;
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

	public Collection<BeneficioOtorgadoEmpresaVO> findUltimosBeneficios(
			Long codigoEmpresa) {
		try {
			return empresaDAOImpl.findUltimosBeneficios(codigoEmpresa);
		} catch (IncorrectResultSizeDataAccessException e) {
			return null;
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

	public Collection<BeneficioVO> findDetalleBeneficios(Long codigoBeneficio,
			Long codigoEmpresa) {
		try {
			if (codigoBeneficio == null || codigoEmpresa == null) {
				throw new DAOException("Requiere codigo beneficio y empresa.");
			}
			return empresaDAOImpl.findDetalleBeneficios(codigoBeneficio,
					codigoEmpresa);
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

	public Collection<BeneficioOtorgadoEmpresaVO> findReporteDetalladoBeneficios(
			RepEmpresaVO criteria, List<CondicionConsultaVO> filtros) {
		try {
			return empresaDAOImpl.findReporteDetalladoBeneficios(criteria,
					filtros);
		} catch (IncorrectResultSizeDataAccessException e) {
			return null;
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

	public Collection<BeneficioOtorgadoEmpresaVO> findReporteTotalBeneficios(
			RepEmpresaVO criteria, List<CondicionConsultaVO> filtros) {
		try {
			return empresaDAOImpl.findReporteTotalBeneficios(criteria, filtros);
		} catch (IncorrectResultSizeDataAccessException e) {
			return null;
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

	public Collection<EmpresaVO> findAllEmpresas() {
		try {
			return empresaDAOImpl.findAllEmpresas();
		} catch (IncorrectResultSizeDataAccessException e) {
			return null;
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

	public Collection<ProgramaVO> findProgramasEntregados() {
		try {
			return empresaDAOImpl.findProgramasEntregados();
		} catch (IncorrectResultSizeDataAccessException e) {
			return null;
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

	public Collection<ProgramaVO> findProgramasEntregadosByCriteria(
			EmpresaVO criteria) {
		try {
			return empresaDAOImpl.findProgramasEntregadosByCriteria(criteria);
		} catch (IncorrectResultSizeDataAccessException e) {
			return null;
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

	public Collection<SubprogramaVO> findSubprogramasEntregados(
			Long codePrograma) {
		try {
			return empresaDAOImpl.findSubprogramasEntregados(codePrograma);
		} catch (IncorrectResultSizeDataAccessException e) {
			return null;
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

	public Collection<ProgramaVO> findProgramasParaEmpresa() {
		try {
			return empresaDAOImpl.findProgramasParaEmpresa();
		} catch (IncorrectResultSizeDataAccessException e) {
			return null;
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

	public Collection<SubprogramaVO> findSubprogramasParaEmpresa(
			Long codePrograma) {
		try {
			return empresaDAOImpl.findSubprogramasParaEmpresa(codePrograma);
		} catch (IncorrectResultSizeDataAccessException e) {
			return null;
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

	public ReporteTotalComunaVO findFiltersComuna(ReporteTotalComunaVO objRtcVO) {
		try {
			return empresaDAOImpl.findFiltersComuna(objRtcVO);
		} catch (IncorrectResultSizeDataAccessException e) {
			return null;
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

	public Collection<ReportComunaVO> findBeneficiosEmpresasComuna(
			ReporteTotalComunaVO criteria,
			Collection<CondicionConsultaVO> filtros) {
		try {
			return empresaDAOImpl.findBeneficiosEmpresasComuna(criteria,
					filtros);
		} catch (IncorrectResultSizeDataAccessException e) {
			return null;
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

	public Collection<BeneficioOtorgadoEmpresaVO> findResumenBeneficioOtorgadoDetByCriteria(
			RepEmpresaVO criteria) {
		try {
			return empresaDAOImpl
					.findResumenBeneficioOtorgadoDetByCriteria(criteria);
		} catch (IncorrectResultSizeDataAccessException e) {
			return null;
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

	public Collection<BeneficioOtorgadoEmpresaVO> findReporteBeneficioOtorgadoDet(
			List<RepAtributoVO> atributosEspecificos,
			List<CondicionConsultaVO> filtros, RepEmpresaVO criteria) {
		try {
			return empresaDAOImpl.findReporteBeneficioOtorgadoDet(
					atributosEspecificos, filtros, criteria);
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

	@Override
	public Collection<String> findActividadesEconomicas() {
		try {
			return empresaDAOImpl.findActividadesEconomicas();
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}

	@Override
	public Collection<EmpresaVO> findEmpresasByActividadEconomica(
			String actividadEconomica) {
		try {
			return empresaDAOImpl
					.findEmpresasByActividadEconomica(actividadEconomica);
		} catch (Exception e) {
			throw new DAOException(e);
		}
	}
}
